package loja.model.compra.pedido;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name = "pedido_compra")
public class PedidoCompra implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue
	@Column(name = "id_pedido_compra")
	private Long idPedidoCompra;
	@Temporal(TemporalType.DATE)
	private Calendar data;
	@Column(precision = 10, scale = 4)
	private BigDecimal valor = BigDecimal.ZERO;
	@Enumerated(EnumType.STRING)
	private ItemPedidoCompraStatusType status;
	@OneToMany(cascade = CascadeType.ALL, mappedBy = "pedidoCompra", fetch = FetchType.EAGER)
	private List<ItemPedidoCompra> itensPedidoCompra = new ArrayList<>();

	public PedidoCompra() {
		Calendar data = Calendar.getInstance();
		data.setTime(new Date());
		this.data = data;
	}

	public Long getIdPedidoCompra() {
		return idPedidoCompra;
	}

	public void setIdPedidoCompra(Long idPedidoCompra) {
		this.idPedidoCompra = idPedidoCompra;
	}

	public Calendar getData() {
		return data;
	}

	public void setData(Calendar data) {
		this.data = data;
	}

	public BigDecimal getValor() {
		BigDecimal soma = BigDecimal.ZERO;
		for (ItemPedidoCompra itemPedidoCompra : itensPedidoCompra) {
			soma = soma.add(itemPedidoCompra.getPreco().multiply(
					new BigDecimal(itemPedidoCompra.getQuantidade())));
		}
		this.valor = soma;

		return valor;
	}

	public void setValor(BigDecimal valor) {
		this.valor = valor;
	}

	public ItemPedidoCompraStatusType getStatus() {
		return status;
	}

	public void setStatus(ItemPedidoCompraStatusType status) {
		this.status = status;
	}

	public List<ItemPedidoCompra> getItensPedidoCompra() {
		return itensPedidoCompra;
	}

	public void setItensPedidoCompra(List<ItemPedidoCompra> itensPedidoCompra) {
		this.itensPedidoCompra = itensPedidoCompra;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((data == null) ? 0 : data.hashCode());
		result = prime * result
				+ ((idPedidoCompra == null) ? 0 : idPedidoCompra.hashCode());
		result = prime
				* result
				+ ((itensPedidoCompra == null) ? 0 : itensPedidoCompra
						.hashCode());
		result = prime * result + ((status == null) ? 0 : status.hashCode());
		result = prime * result + ((valor == null) ? 0 : valor.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (!(obj instanceof PedidoCompra))
			return false;
		PedidoCompra other = (PedidoCompra) obj;
		if (data == null) {
			if (other.data != null)
				return false;
		} else if (!data.equals(other.data))
			return false;
		if (idPedidoCompra == null) {
			if (other.idPedidoCompra != null)
				return false;
		} else if (!idPedidoCompra.equals(other.idPedidoCompra))
			return false;
		if (itensPedidoCompra == null) {
			if (other.itensPedidoCompra != null)
				return false;
		} else if (!itensPedidoCompra.equals(other.itensPedidoCompra))
			return false;
		if (status != other.status)
			return false;
		if (valor == null) {
			if (other.valor != null)
				return false;
		} else if (!valor.equals(other.valor))
			return false;
		return true;
	}

}
